import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {

        LaunchApplication.printWelcome();

        Serveur s;

        s = new Serveur();

        /**
         * Create journeys
         */
        Trajet j1 = new Trajet(Ville.MADRID, Ville.PARIS,
                new GregorianCalendar(2011, Calendar.DECEMBER, 20, 17, 20)
                        .getTime(), new GregorianCalendar(2011,
                        Calendar.DECEMBER, 20, 18, 21).getTime());
        Trajet j2 = new Trajet(Ville.NEWYORK, Ville.ROME, new Date(),
                new Date());
        Trajet j3 = new Trajet(Ville.MOSCOU, Ville.PARIS, new Date(),
                new Date());

        /**
         * Create transports
         */
        Transport plane = new Transport(TypeTransport.PLANE, 300);
        Transport car = new Transport(TypeTransport.CAR, 5);

        /**
         * Add journeys to transports
         */
        plane.addJourney(j2);
        car.addJourney(j3);
        car.addJourney(j1);

        /**
         * Ajouter les transport au serveur
         */
        s.addTransport(plane);
        s.addTransport(car);

        /**
         * Ajouter des reservations au trajet n°1
         */
        s.addReservation(1, "Robert", "Doux");
        s.addReservation(1, "Henry", "Charles");

        /**
         * Serialization/Deserialization
         */
        System.out
                .println("-------------------------------------\nSerialisation par fichier de données\n-------------------------------------\n");
        LaunchApplication.stop();
        s.saveTransportsAsDataFile();
        System.out
                .println("-------------------------------------\nDéserialisation par fichier de données\n-------------------------------------\n");
        LaunchApplication.stop();
        s.loadTransports(Serveur.loadTransportsWithDataFile());

        LaunchApplication.stop();

        s.consult();

        System.out
                .println("Recherche un transport Madrid -- Paris le 20/12/2011 à partir de 16h :\n");

        LaunchApplication.stop();
        s.search(Ville.MADRID, Ville.PARIS, new GregorianCalendar(2011,
                Calendar.DECEMBER, 20, 16, 00).getTime());

        try {
            System.out
                    .println("-------------------------------------\nSerialisation par fichier texte\n-------------------------------------\n");
            s.saveServerAsTextFile();

            LaunchApplication.stop();

            // Chargement du serveur à partir d'un fichier texte
            //
            Serveur u = new Serveur(Serveur.loadServerWithTextFile());
            System.out
                    .println("-------------------------------------\nDéserialisation par fichiers texte\n-------------------------------------\n");

            u.consult();

        } catch (Exception e) {
            e.printStackTrace();
        }

        /**
         * Test of the Admin part
         */
        System.out.println("Test de la partie ADMIN : \n");
        LaunchApplication.stop();
        Admin a = new Admin(s);

        /**
         * Add a reservation
         */
        System.out.println("\t+ Ajout de réservations\n");
        a.book(1, "Bond", "James");
        a.book(2, "Johns", "Pascal");

        s.consult();

        LaunchApplication.stop();

        /**
         * Search for journeys
         */
        System.out
                .println("\t+ Fonction de recherche 1 (Ville départ = NY, Ville arrivée = ROME)\n");
        a.search(Ville.NEWYORK, Ville.ROME);

        LaunchApplication.stop();

        System.out
                .println("\t+ Fonction de recherche 2 (Ville départ = MADRID, Ville arrivée = PARIS, à partir de 16h le 20/12/2011)\n");
        LaunchApplication.stop();
        a.search(Ville.MADRID, Ville.PARIS, new GregorianCalendar(2011,
                Calendar.DECEMBER, 20, 16, 00).getTime());

        LaunchApplication.stop();

        System.out
                .println("\t+ Fonction de recherche 3 (Ville arrivée = PARIS)\n");
        LaunchApplication.stop();
        a.searchArrived(Ville.PARIS);

        LaunchApplication.stop();

        /**
         * Transport modifications
         */
        System.out
                .println("\t+ Fonction de modification de transport (Transport n°1 = 7 personnes), freeCapacity updated\n");
        LaunchApplication.stop();
        a.modifyTransport(2, null, 7);
        a.consult();

        /**
         * Delete a journey
         */
        System.out.println("\t+ Suppression d'un trajet (Madrid -- Paris)\n");
        LaunchApplication.stop();
        a.deleteTrajet(1);
        a.consult();

        /**
         * Delete a transport
         */
        System.out.println("\t+ Suppression d'un transport (avion)\n");
        LaunchApplication.stop();
        a.deleteTransport(1);
        a.consult();

        LaunchApplication.stop();

        System.out.println("******* La présentation est terminée *******");

    }

}
